JavaScript面向对象编程笔记

330次阅读
没有评论

共计 2804 个字符,预计需要花费 8 分钟才能阅读完成。

构造函数和原型

ES6 之前没有提供 extends 继承,可以通过构造函数 + 原型对象模拟实现继承,被称为组合继承。

call()

调用这个函数并且修改函数运行时的 this 指向。

function fn() {console.log(this)
}
const obj = {name: "佩奇",}
fn() //Window
fn.call(obj) //Object

继承父类属性:

function Father(name, age) {
  this.name = name
  this.age = age
}
function Son(name, age, score) {
  // 把父构造函数的 this 改为子构造函数的 this
  Father.call(this, name, age, score)
  this.score = score
}
const son = new Son("佩奇", 10, 99)
console.log(son) //Son {name: '佩奇', age: 10, score: 99}

继承父类方法:

function Father(name, age) {
  this.name = name
  this.age = age
}
Father.prototype.money = function () {console.log(10000)
}
function Son(name, age, score) {
  // 把父构造函数的 this 改为子构造函数的 this
  Father.call(this, name, age, score)
  this.score = score
}
Son.prototype = new Father()
Son.prototype.constructor = Son // 利用 constructor 指回用来的构造函数
Son.prototype.exam = function () {console.log("儿子要考试!")
}
const son = new Son("佩奇", 10, 99)
console.log(Son.prototype.constructor) //Son

类是对象模板,可以将对象中的属性和方法直接定义在类中。定义后,就可以直接通过类来创建对象。通过同一个类创建的对象,称为同类对象。可以使用 instanceof 来检查一个对象是否是由某个类创建,如果是则称该对象是这个类的实例。

class Person {}
const p = new Person() // 调用构造函数,创建实例对象
console.log(p instanceof Person) // true

类中的所有代码都会在严格模式下执行。严格模式下其中一个特点就是,函数的 this 不在是 window,而是 undefined。

注意:

  • 在类中方法的 this 不是固定的:以方法形式调用时,this 就是当前的实例;以函数形式调用,this 是 undefined
  • 在有些场景下,希望方法中的 this 是固定的,不会因调用方式不同而改变。可以使用箭头函数来定义类中的方法,则方法中的 this 恒为当前实例,不会改变。

属性与方法

class Person {
  name = 'Tom' // 实例属性
  age = 25
  // 实例方法
  sayHi() {console.log(`Hi, my name is ${this.name}`)
  }

  static sex = 'male' // 静态属性(类属性)// 静态方法(类方法)static sayHi() {console.log('Hi, I am a person')
  }
}

const p = new Person()
console.log(p.name) // Tom
p.sayHi() // Hi, my name is Tom

console.log(Person.sex) // male
Person.sayHi() // Hi, I am a person

构造函数

class Person {
  // 构造函数在调用类创建对象时执行
  constructor(name, age) {
    this.name = name
    this.age = age
  }
}

const p = new Person('Tom', 25)
console.log(p.name, p.age) // Tom 25

封装(安全性)

封装主要用来保证数据的安全,实现封装的方式:

  • 属性私有化:加 #
  • 通过 getter 和 setter 方法来操作属性

对象是一个用来存储不同属性的容器,不仅存储属性,还要负责数据的安全。直接添加到对象中的属性,并不安全,因为它们可以被任意的修改。

如何确保数据的安全:

  • 私有化数据:将需要保护的数据设为私有,只能在类内部使用
  • 提供 setter 和 getter 方法来开放对数据的操作,好处是可以控制属性的读写权限,可以在方法中对属性值进行验证
class Person {
  #age // 加上 #表示私有属性,只能在类的内部访问
  constructor(name, age) {
    this.name = name
    this.#age = age
  }

  get age() {return this.#age}

  set age(value) {if (value < 0) {throw new Error('Age cannot be negative')
    }
    this.#age = value
  }
}

const p = new Person('Tom', 25)
console.log(p) // Person {name: 'Tom', #age: 25}
p.age = 100
console.log(p) // Person {name: 'Tom', #age: 100}

多态(灵活性)

在 JS 中不会检查参数类型,这就意味着任何数据都可以作为参数传递。要调用某个函数,无需指定类型,只要对象满足某些条件即可。如果一个东西走路像鸭子,叫起来像鸭子,那么它就是鸭子。多态为我们提供了灵活性。

class Dog {constructor(name) {this.name = name}
}

class Cat {constructor(name) {this.name = name}
}

const dog = new Dog('旺财')
const cat = new Cat('小白')

function sayHello(animal) {console.log(` 你好,${animal.name}`)
}

sayHello(dog) // 你好,旺财
sayHello(cat) // 你好,小白 

继承(扩展性)

class Animal {constructor(name) {this.name = name}
  sayHi() {console.log(` 动物叫。。。`)
  }
}

class Dog extends Animal {
  // 重写父类构造函数
  constructor(name, age) {super(name) // 调用父类构造函数
    this.age = age
  }
  sayHi() {console.log(` 狗叫。。。`)
    super.sayHi() // 调用父类方法}
}

const dog = new Dog('旺财', 2)
console.log(dog.name, dog.age) // 旺财 2
dog.sayHi() // 狗叫。。。

正文完
 0
阿伯手记
版权声明:本站原创文章,由 阿伯手记 于2023-08-02发表,共计2804字。
转载说明:本站原创内容,除特殊说明外,均基于 CC BY-NC-SA 4.0 协议发布,转载须注明出处与链接。
评论(没有评论)
验证码

阿伯手记

阿伯手记
阿伯手记
喜欢编程,头发渐稀;成长路上,宝藏满地
文章数
767
评论数
207
阅读量
683493
今日一言
-「
热门文章
职场救急!AI请假话术生成器:1秒定制高通过率理由

职场救急!AI请假话术生成器:1秒定制高通过率理由

超级借口 不好开口?借口交给我!智能生成工作请假、上学请假、饭局爽约、约会拒绝、邀约推辞、万能借口等各种借口理...
夸克网盘快传助手提高非VIP下载速度

夸克网盘快传助手提高非VIP下载速度

夸克网盘限速这个大家都知道,不开会员差不多限速在几百 K。那有没有办法在合法合规途径加速下载夸克网盘呢?这里推...
TVAPP:开源电视盒子资源库,一键打造家庭影院

TVAPP:开源电视盒子资源库,一键打造家庭影院

导语 TVAPP 是一个专为 Android TV 电视盒子用户打造的开源影音资源库,集成了影视、直播、游戏等...
巴别英语:用美剧和TED演讲轻松提升英语听力与口语

巴别英语:用美剧和TED演讲轻松提升英语听力与口语

还在为枯燥的英语学习而烦恼吗?巴别英语通过创新的美剧学习模式,让英语学习变得生动有趣。平台提供海量美剧和 TE...
Chinese Name Generator 在线中文姓名生成器

Chinese Name Generator 在线中文姓名生成器

Chinese Name Generator 是一款在线中文姓名生成器,可在几秒内生成符合个人需求的中文名字。...
2025年12月 每日精选

2025年12月 每日精选

关于每日精选栏目 发现一些不错的资源,点击 这里 快速投稿。 12 月 26 日 .ax 顶级域 目前全球唯一...
123云盘限时福利:登录即送1个月VIP尊享权益!

123云盘限时福利:登录即送1个月VIP尊享权益!

🎁  零成本体验 20T 超大空间与会员加速通道 🎉 活动亮点 登录即送:无需任何复杂操作,登录账号直接领取 ...
最新评论
阿伯手记 阿伯手记 发了:https://aboss.top/moments/1064
吴蛋蛋 吴蛋蛋 快发小年快乐
吴蛋蛋 吴蛋蛋 Ask4Me,这个之前看server酱接入了
15220202929 15220202929 怎么用
八对 八对 麻烦大佬更新下【堆新】的友链站名:八对星星描述:极目星视穹苍无界•足履行者大地有疆链接:https://8dui.com图标:https://cf.8dui.com/logo.webp横标:https://cf.8dui.com/logo-w.webp订阅:https://8dui.com/rss.xml
三毛笔记 三毛笔记 已添加
DUINEW DUINEW 已添加贵站,期待贵站友链~博客名称:堆新博客地址:https://duinew.com/博客描述:堆新堆新,引力向新!——堆新(DUINEW)博客头像:https://d.duinew.com/logo.webp横版头像:https://d.duinew.com/logo-w.webp博客订阅:https://duinew.com/rss.xml
hedp hedp 没看懂
bingo bingo 直接生成就可以啦,也可以添加一些选项
热评文章
夸克网盘快传助手提高非VIP下载速度

夸克网盘快传助手提高非VIP下载速度

夸克网盘限速这个大家都知道,不开会员差不多限速在几百 K。那有没有办法在合法合规途径加速下载夸克网盘呢?这里推...
Short-Link 免费开源短网址程序,基于Fastify、Vercel和Supabase构建

Short-Link 免费开源短网址程序,基于Fastify、Vercel和Supabase构建

Short-Link 是一款基于 Fastify、Vercel 和 Supabase 构建的 URL 缩短服务...
清华大学官方免费DeepSeek教程

清华大学官方免费DeepSeek教程

AI 领域近期最引人注目的焦点当属 DeepSeek,这款由中国创新企业深度求索研发的人工智能工具,正以开放源...
Chinese Name Generator 在线中文姓名生成器

Chinese Name Generator 在线中文姓名生成器

Chinese Name Generator 是一款在线中文姓名生成器,可在几秒内生成符合个人需求的中文名字。...
2026年2月 每日精选

2026年2月 每日精选

关于每日精选栏目 发现一些不错的资源,点击 这里 快速投稿。 2 月 17 日 国家全民健身信息服务平台 过年...
DrawLink:一键生成链接视觉卡片,提升分享点击率

DrawLink:一键生成链接视觉卡片,提升分享点击率

小贴士 :此站或已变迁,但探索不止步。我们已为您备好「类似网站」精选合集,相信其中的发现同样能为您带来惊喜。
WebRTC Screen Mirror:基于浏览器免费开源投屏神器,可实现低延迟、跨平台屏幕共享

WebRTC Screen Mirror:基于浏览器免费开源投屏神器,可实现低延迟、跨平台屏幕共享

WebRTC Screen Mirror 是一款基于 WebRTC 技术的在线屏幕共享工具,它利用浏览器内置的...